From: Eddie Dong Date: Thu, 9 Jun 2011 08:24:09 +0000 (+0800) Subject: x86/hvm: extend nhvm_vmcx_guest_intercepts_trap to include errcode X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~10205 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=dcbb72dd1122bf7f3c178bba9caefeee65ca8a08;p=xen.git x86/hvm: extend nhvm_vmcx_guest_intercepts_trap to include errcode to assist decision of TRAP_page_fault in VMX. Signed-off-by: Qing He Signed-off-by: Eddie Dong Acked-by: Christoph Egger Acked-by: Tim Deegan Committed-by: Tim Deegan --- diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 461bd5bed1..95e5561d77 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -1145,7 +1145,7 @@ void hvm_inject_exception(unsigned int trapnr, int errcode, unsigned long cr2) return; } - if ( nhvm_vmcx_guest_intercepts_trap(v, trapnr) ) + if ( nhvm_vmcx_guest_intercepts_trap(v, trapnr, errcode) ) { enum nestedhvm_vmexits nsret; @@ -4137,10 +4137,10 @@ uint32_t nhvm_vcpu_asid(struct vcpu *v) return -EOPNOTSUPP; } -int nhvm_vmcx_guest_intercepts_trap(struct vcpu *v, unsigned int trap) +int nhvm_vmcx_guest_intercepts_trap(struct vcpu *v, unsigned int trap, int errcode) { if (hvm_funcs.nhvm_vmcx_guest_intercepts_trap) - return hvm_funcs.nhvm_vmcx_guest_intercepts_trap(v, trap); + return hvm_funcs.nhvm_vmcx_guest_intercepts_trap(v, trap, errcode); return -EOPNOTSUPP; } diff --git a/xen/arch/x86/hvm/svm/nestedsvm.c b/xen/arch/x86/hvm/svm/nestedsvm.c index 5812f73d9b..8de07e16d0 100644 --- a/xen/arch/x86/hvm/svm/nestedsvm.c +++ b/xen/arch/x86/hvm/svm/nestedsvm.c @@ -955,7 +955,7 @@ nsvm_vmcb_guest_intercepts_exitcode(struct vcpu *v, } int -nsvm_vmcb_guest_intercepts_trap(struct vcpu *v, unsigned int trapnr) +nsvm_vmcb_guest_intercepts_trap(struct vcpu *v, unsigned int trapnr, int errcode) { return nsvm_vmcb_guest_intercepts_exitcode(v, guest_cpu_user_regs(), VMEXIT_EXCEPTION_DE + trapnr); diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h index 4cbaac655b..70e79978bc 100644 --- a/xen/include/asm-x86/hvm/hvm.h +++ b/xen/include/asm-x86/hvm/hvm.h @@ -164,7 +164,8 @@ struct hvm_function_table { uint64_t (*nhvm_vcpu_guestcr3)(struct vcpu *v); uint64_t (*nhvm_vcpu_hostcr3)(struct vcpu *v); uint32_t (*nhvm_vcpu_asid)(struct vcpu *v); - int (*nhvm_vmcx_guest_intercepts_trap)(struct vcpu *v, unsigned int trapnr); + int (*nhvm_vmcx_guest_intercepts_trap)(struct vcpu *v, + unsigned int trapnr, int errcode); bool_t (*nhvm_vmcx_hap_enabled)(struct vcpu *v); @@ -461,7 +462,8 @@ uint64_t nhvm_vcpu_hostcr3(struct vcpu *v); uint32_t nhvm_vcpu_asid(struct vcpu *v); /* returns true, when l1 guest intercepts the specified trap */ -int nhvm_vmcx_guest_intercepts_trap(struct vcpu *v, unsigned int trapnr); +int nhvm_vmcx_guest_intercepts_trap(struct vcpu *v, + unsigned int trapnr, int errcode); /* returns true when l1 guest wants to use hap to run l2 guest */ bool_t nhvm_vmcx_hap_enabled(struct vcpu *v); diff --git a/xen/include/asm-x86/hvm/svm/nestedsvm.h b/xen/include/asm-x86/hvm/svm/nestedsvm.h index 333496c3f2..ec8114643c 100644 --- a/xen/include/asm-x86/hvm/svm/nestedsvm.h +++ b/xen/include/asm-x86/hvm/svm/nestedsvm.h @@ -117,7 +117,8 @@ uint64_t nsvm_vcpu_hostcr3(struct vcpu *v); uint32_t nsvm_vcpu_asid(struct vcpu *v); int nsvm_vmcb_guest_intercepts_exitcode(struct vcpu *v, struct cpu_user_regs *regs, uint64_t exitcode); -int nsvm_vmcb_guest_intercepts_trap(struct vcpu *v, unsigned int trapnr); +int nsvm_vmcb_guest_intercepts_trap(struct vcpu *v, unsigned int trapnr, + int errcode); bool_t nsvm_vmcb_hap_enabled(struct vcpu *v); enum hvm_intblk nsvm_intr_blocked(struct vcpu *v);